
package Product_function;

import come_true.Student;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JPanelScore extends JPanel {

    private double[] value;
    private String[] classes;
    private String title;

    public JPanelScore(double[] val, String[] lang, String t) {
        classes = lang;
        value = val;
        title = t;
    }

    public void paintComponent(Graphics graphics) {
        
        super.paintComponent(graphics);//绘制窗体
        double minValue = 0;//柱形最小值
        double maxValue = 0;//柱形最大值
        for (int i = 0; i < value.length; i++) {
            if (minValue > value[i]) {
                minValue = value[i];
            }
            if (maxValue < value[i]) {
                maxValue = value[i];
            }
        }//将数据的最大最小值记为柱形的大小范围
        Dimension dim = getSize();//设置图形的长宽
        int clientWidth = dim.width;//定义窗体宽度
        int clientHeight = dim.height;//定义窗体高度
        int barWidth = clientWidth / value.length;//每条柱形平均宽度
        Font titleFont = new Font("gb2312", Font.BOLD, 20);
        //标题格式为gb2312才不会导致中文乱码
        //中文 加粗 20号字体
        FontMetrics titleFontMetrics = graphics.getFontMetrics(titleFont);
        Font labelFont = new Font("gb2312", Font.PLAIN, 15);
        //数据名称格式为gb2312才不会导致中文乱码
        FontMetrics labelFontMetrics = graphics.getFontMetrics(labelFont);
        int titleWidth = titleFontMetrics.stringWidth(title);//标题总宽度
        int q = titleFontMetrics.getAscent() + 3;//标题距上界距离
        int p = (clientWidth - titleWidth) / 2;//设置为居中
        graphics.setFont(titleFont);//标题输出格式设置完成
        graphics.drawString(title, p, q);
        //输出标题
        //str - 要绘制的 string。
        //x - x 坐标。
        //y - y 坐标。 
        int top = titleFontMetrics.getHeight();//图形区域上边缘坐标等于标题高度
        int bottom = labelFontMetrics.getHeight();//图形区域下边缘坐标等于数据名称高度
        double scale = (clientHeight - top - bottom) / (maxValue - minValue);//单位高度
        q = clientHeight - labelFontMetrics.getDescent();
        //设置数据名称y坐标，为窗体高度-文本基线到下降线距离
        graphics.setFont(labelFont);//数据名称输出格式设置完成
        for (int j = 0; j < value.length; j++) {
            int valueP = j * barWidth + 1;//要填充矩形的 x 坐标
            int valueQ = top;//要填充矩形的 y 坐标
            int height = (int) (value[j] * scale);//要填充矩形的高度
            valueQ += (int) ((maxValue - value[j]) * scale);//要填充矩形的宽度
            graphics.setColor(Color.lightGray);//设置柱形图颜色
            graphics.fillRect(valueP, valueQ, barWidth, height);
            //填充柱形图
            graphics.setColor(Color.darkGray);//设置边框颜色
            graphics.drawRect(valueP, valueQ, barWidth, height);
            //柱形图边框
            int labelWidth = labelFontMetrics.stringWidth(classes[j]);
            p = j * barWidth + (barWidth - labelWidth) / 2;
            graphics.setColor(Color.black);//设置数据名称颜色
            graphics.drawString(classes[j], p, q);
            //设置柱状图的坐标
            //str - 要呈现的字符串
            //x - 呈现 String 位置的 x 坐标
            //y - 呈现 String 位置的 y 坐标 
        }
    }

    public static void main(Student s) {
        JFrame frame = new JFrame();
        frame.setSize(400, 300);//设置窗口大小
        int w = (Toolkit.getDefaultToolkit().getScreenSize().width-400) / 2;
        int h = (Toolkit.getDefaultToolkit().getScreenSize().height-300) / 2;
        frame.setLocation(w, h);
        double[] value = new double[3];
        String[] classes = new String[3];
        value[0] = s.getScoreList().get(0).getScore();
        classes[0] = "数学"+s.getScoreList().get(0).getScore();
        value[1] = s.getScoreList().get(1).getScore();
        classes[1] = "Java"+s.getScoreList().get(1).getScore();
        value[2] = s.getScoreList().get(2).getScore();
        classes[2] = "体育"+s.getScoreList().get(2).getScore();
        frame.getContentPane().add(new JPanelScore(value, classes, s.getName() + "的成绩单"));
        //输出柱形图各数据名称
        WindowListener winListener = new WindowAdapter() {
            public void windowClosing(WindowEvent event) {
//                System.exit(0);
                frame.setVisible(false);
            }
        };
        frame.addWindowListener(winListener);//建立一个窗口
        frame.setVisible(true);//弹出窗口
    }
}
